home *** CD-ROM | disk | FTP | other *** search
/ PCDisk Magazine Disks / PCDisk Magazine - Disk 2.img / TUTOR3.BAS (.txt) < prev    next >
Encoding:
GW-BASIC  |  1984-11-10  |  20.2 KB  |  494 lines

  1. 10  ' ====================================================================
  2. 20  '                           GRAPHICS TUTOR
  3. 30  '       Copyright (C) 1984 Stan W. Merrill -- All Rights Reserved
  4. 40  ' ====================================================================
  5. 50  ' --------------------------------------------------------------------
  6. 60  ' -- Declare Global Constants
  7. 70  ' --------------------------------------------------------------------
  8. 80  ' -- program constants
  9. 90   NO           =  0  :  YES        =  1  :  MENU.ENTRIES =   9
  10. 100  YELLOW       = 14  :  WHITE      = 15  :  BLACK        =   0
  11. 110  CYAN         =  3  :  FKEY.ROW   =  6  :  FKEY.COL     =  34
  12. 120  NO.CURSOR    =  0  :  ESC$       = CHR$(27)
  13. 130  ' -- provide values and labels for graph variable
  14. 140  GRAPH.TITLE$ = ">>>   Monthly Sales   <<<"
  15. 150  NUM.CASES = 12 : DIM VALUE(12), LABEL$(12), X(12), Y(12)
  16. 160  DATA 100, 150, 100, 175, 200,  50
  17. 170  DATA 200, 225, 150, 275, 300, 325
  18. 180  DATA Jan, Feb, Mar, Apr, May, Jun
  19. 190  DATA Jul, Aug, Sep, Oct, Nov, Dec
  20. 200  ' -- graph constants
  21. 210  SCREEN.WIDTH = 320 : SCREEN.HEIGHT = 200 : PI = 3.14159 : NUM.TICKS = 4
  22. 220  X.CENTER = 160 : Y.CENTER = 100 : RADIUS  = 75 : ASPECT = 0.92
  23. 230  START.X   = 75 : END.X    = 275 : START.Y = 20 : END.Y = 150
  24. 240  LENGTH.X = ABS(END.X - START.X) : LENGTH.Y = ABS(END.Y - START.Y)
  25. 250  SCREEN.WIDTH.ADJUST = LENGTH.X/SCREEN.WIDTH
  26. 260  SCREEN.HEIGHT.ADJUST = (LENGTH.Y/SCREEN.HEIGHT) * 2
  27. 270  TEXT.CELL.WIDTH = SCREEN.WIDTH/40
  28. 280  TEXT.CELL.HEIGHT = SCREEN.HEIGHT/25 
  29. 290  BAR.WIDTH = INT(LENGTH.X/(NUM.CASES + 1))
  30. 300  GAP = INT(BAR.WIDTH/NUM.CASES)
  31. 310  ' ------------------------------------------------------------------
  32. 320  ' -- Main Control Section
  33. 330  ' ------------------------------------------------------------------
  34. 340  GOSUB 1480     ' -- reset function keys
  35. 350  WHILE (YES)
  36. 360    WIDTH 80       ' -- set screen width
  37. 370    SCREEN 0,0,0   ' -- set text mode
  38. 380    CLS
  39. 390    GOSUB 620      ' -- Menu title
  40. 400    GOSUB 770      ' -- Show menu
  41. 410    GOSUB 1290   ' -- Get choice (FKEY)
  42. 420    COLOR WHITE, BLACK, NO.CURSOR
  43. 430    IF FKEY <= 9 THEN GOSUB 1150   ' -- Highlight Key Top
  44. 440    IF FKEY =  1 THEN GOSUB 1810   ' -- Rubber Bands
  45. 450    IF FKEY =  2 THEN GOSUB 3040   ' -- Pie Chart
  46. 460    IF FKEY =  3 THEN GOSUB 1970   ' -- Line Graph
  47. 470    IF FKEY =  4 THEN GOSUB 2850   ' -- Bar Graph
  48. 480    IF FKEY =  5 THEN GOSUB 3410   ' -- Turtle
  49. 490    IF FKEY =  6 THEN GOSUB 4100   ' -- Neon Girl
  50. 500    IF FKEY =  7 THEN GOSUB 3950   ' -- Text Color
  51. 510    IF FKEY =  8 THEN GOSUB 4690   ' -- Geo Shapes
  52. 520    IF FKEY = 46 THEN CLS : LIST 1810-1960  ' -- Rubber Bands
  53. 530    IF FKEY = 48 THEN CLS : LIST 1970-2170  ' -- Line Graph
  54. 540    IF FKEY = 49 THEN CLS : LIST 2850-3030  ' -- Bar Graph
  55. 550    IF FKEY = 47 THEN CLS : LIST 3040-3400  ' -- Pie Chart
  56. 560    IF FKEY = 50 THEN CLS : LIST 3410-3760  ' -- Turtle
  57. 570    IF FKEY = 51 THEN CLS : LIST 4100-4680  ' -- Neon Girl
  58. 580    IF FKEY = 52 THEN CLS : LIST 3950-4090  ' -- Text Color
  59. 590    IF FKEY = 53 THEN CLS : LIST 4690-4930  ' -- Geo Shapes
  60. 600  WEND
  61. 610  END
  62. 620  ' ------------------------------------------------------------------
  63. 630  ' -- Subroutine: MENU TITLE
  64. 640  ' ------------------------------------------------------------------
  65. 650  TITLE$     = "> > >    GRAPHICS TUTOR    < < <"
  66. 660  AUTHOR$ = "Copyright (C) 1984 by Stan W. Merrill -- All Rights Reserved"
  67. 670  MSG1$ = "Press a Function Key to View a Graphics Display"
  68. 680  MSG2$ = "Press the <ALT> Key Plus a Function Key to View Program"
  69. 690  MSG3$ = "Type RUN and Press "+CHR$(17)+CHR$(196)+CHR$(217)+" to Restart Program After Viewing"
  70. 700  COLOR YELLOW, BLACK
  71. 710  LOCATE 2,(40 - (LEN(TITLE$)/2))   :  PRINT TITLE$;
  72. 720  LOCATE 3,(40 - (LEN(AUTHOR$)/2))  :  PRINT AUTHOR$;
  73. 730  LOCATE 23, (40 - (LEN(MSG1$)/2))  :  PRINT MSG1$;
  74. 740  LOCATE 24, (40 - (LEN(MSG2$)/2))  :  PRINT MSG2$;
  75. 750  LOCATE 25, (40 - (LEN(MSG3$)/2))  :  PRINT MSG3$;
  76. 760  RETURN
  77. 770  ' ------------------------------------------------------------------
  78. 780  ' -- Subroutine: DRAW A SET OF FKEYS
  79. 790  ' -- Requires:   FKEY.ROW, FKEY.COL        Returns: (nothing)
  80. 800  ' ------------------------------------------------------------------
  81. 810  RESTORE 1010
  82. 820  LEFT.OF.BOX = FKEY.COL  :  FKEY = -1
  83. 830  FOR TOP.OF.BOX = FKEY.ROW TO (FKEY.ROW + 12) STEP 3
  84. 840    COLOR CYAN, BLACK  :  GOSUB 1040  ' -- Draw box
  85. 850    FKEY = FKEY + 2    :  GOSUB 1150  ' -- Label the box
  86. 860    COLOR WHITE, BLACK :  READ EXPLANATION$
  87. 870    LOCATE TOP.OF.BOX + 1, (FKEY.COL - LEN(EXPLANATION$) - 2), NO.CURSOR
  88. 880    PRINT EXPLANATION$;
  89. 890  NEXT 'TOP.OF.BOX  
  90. 900  '
  91. 910  LEFT.OF.BOX = FKEY.COL + 6  :  FKEY = 0
  92. 920  FOR TOP.OF.BOX = FKEY.ROW TO (FKEY.ROW + 12) STEP 3
  93. 930    COLOR CYAN, BLACK  :  GOSUB 1040  ' -- Draw box
  94. 940    FKEY = FKEY + 2    :  GOSUB 1150  ' -- Label the Fkey
  95. 950    COLOR WHITE, BLACK :  READ EXPLANATION$
  96. 960    LOCATE TOP.OF.BOX + 1, LEFT.OF.BOX + 8, NO.CURSOR
  97. 970    PRINT EXPLANATION$;
  98. 980  NEXT 'TOP.OF.BOX  
  99. 990  FKEY = -1
  100. 1000  '
  101. 1010  DATA "Rubber Bands", "Line Graph", "Turtle", "Text Color", ""
  102. 1020  DATA "Pie Chart", "Bar Graph", "Neon Girl", "Geo Shapes", "QUIT to SYSTEM"
  103. 1030  RETURN
  104. 1040  ' ------------------------------------------------------------------
  105. 1050  ' -- Subroutine: DRAW A BOX
  106. 1060  ' -- Requires:   TOP.OF.BOX, LEFT.OF.BOX     Returns: (nothing)
  107. 1070  ' ------------------------------------------------------------------
  108. 1080  LOCATE TOP.OF.BOX, LEFT.OF.BOX
  109. 1090  PRINT "KEYTHENTHENTHENTHENOPTION";
  110. 1100  LOCATE TOP.OF.BOX + 1, LEFT.OF.BOX
  111. 1110  PRINT "OPEN    CALL";
  112. 1120  LOCATE TOP.OF.BOX + 2, LEFT.OF.BOX
  113. 1130  PRINT "NOTSOUNDSOUNDSOUNDSOUND'";
  114. 1140  RETURN
  115. 1150  ' ------------------------------------------------------------------
  116. 1160  ' -- Subroutine: LABEL THE FKEY
  117. 1170  ' -- Requires:   FKEY               Returns: (nothing)
  118. 1180  ' ------------------------------------------------------------------
  119. 1190  ' -- Determine Key Top Location
  120. 1200  ODD.EVEN = ((FKEY MOD 2) XOR 1) ' -- 1 if even, 0 if odd
  121. 1210  TOP.OF.BOX = FKEY.ROW + ((FKEY - 1 - ODD.EVEN) * 3/2)
  122. 1220  LEFT.OF.BOX = FKEY.COL
  123. 1230  IF (ODD.EVEN = 1) THEN LEFT.OF.BOX = FKEY.COL + 6
  124. 1240  LOCATE TOP.OF.BOX + 1, LEFT.OF.BOX + 2
  125. 1250  ' -- Label Key Top
  126. 1260  IF (FKEY < 10) THEN PRINT "F"; CHR$(FKEY + 48);
  127. 1270  IF (FKEY = 10) THEN PRINT "F10";
  128. 1280  RETURN
  129. 1290  ' ------------------------------------------------------------------
  130. 1300  ' -- Subroutine: GET USER'S CHOICE (using Function keys)
  131. 1310  ' -- Requires: (nothing)         Returns: FKEY
  132. 1320  ' ------------------------------------------------------------------
  133. 1330  DEF SEG=0: POKE 1050, PEEK(1052) '-- Clear keyboard buffer
  134. 1340  DEF SEG: POKE 106,0              '-- Clear BASIC's buffer
  135. 1350  VALID.KEY = NO
  136. 1360  CHOICE$ = INKEY$
  137. 1370  WHILE ((LEN(CHOICE$) < 2) AND (VALID.KEY = NO))
  138. 1380    CHOICE$ = INKEY$
  139. 1390    WHILE (LEN(CHOICE$) >= 2)
  140. 1400      CHOICE$ = RIGHT$(CHOICE$,1)
  141. 1410      FKEY = ASC(CHOICE$) - 58     ' -- See BASIC manual, App. G
  142. 1420      IF (FKEY >= 1 AND FKEY <= MENU.ENTRIES) THEN VALID.KEY = YES
  143. 1430      IF (FKEY >= 46 AND FKEY <= (MENU.ENTRIES+45)) THEN VALID.KEY = YES
  144. 1440    WEND
  145. 1450    IF FKEY = 10 THEN CLS : SYSTEM
  146. 1460  WEND
  147. 1470  RETURN
  148. 1480  ' ------------------------------------------------------------------
  149. 1490  ' -- Subroutine: FUNCTION KEYS
  150. 1500  ' ------------------------------------------------------------------
  151. 1510  KEY OFF              ' -- turn off function key menu
  152. 1520  FOR FKEY = 1 TO 10   ' -- reset function keys so they
  153. 1530    KEY FKEY,""        ' --   can be used as regular keys
  154. 1540  NEXT 'FKEY           ' --   (See BASIC manual, App. G)
  155. 1550  RETURN
  156. 1560  ' ------------------------------------------------------------------
  157. 1570  ' -- Subroutine: RANDOMIZE
  158. 1580  ' ------------------------------------------------------------------
  159. 1590  T$ = MID$(TIME$,7,2)
  160. 1600  TIME = VAL(T$)
  161. 1610  RANDOMIZE TIME
  162. 1620  RETURN
  163. 1630  ' ------------------------------------------------------------------
  164. 1640  ' -- Subroutine: NUMLOCK ON
  165. 1650  ' ------------------------------------------------------------------
  166. 1660  DEF SEG = 0
  167. 1670  POKE &H417, (PEEK(&H417) OR &H20)
  168. 1680  RETURN
  169. 1690  ' ------------------------------------------------------------------
  170. 1700  ' -- Subroutine: NUMLOCK ON
  171. 1710  ' ------------------------------------------------------------------
  172. 1720  DEF SEG = 0
  173. 1730  POKE &H417, (PEEK(&H417) AND &HDF)
  174. 1740  RETURN
  175. 1750  ' ------------------------------------------------------------------
  176. 1760  ' -- Subroutine: WAIT FOR USER TO RESPOND
  177. 1770  ' ------------------------------------------------------------------
  178. 1780  LOCATE 25, 10, NO.CURSOR : PRINT "Press <ESC> to return.";
  179. 1790  WHILE (INKEY$ <> ESC$) : WEND
  180. 1800  RETURN
  181. 1810  ' ------------------------------------------------------------------
  182. 1820  ' -- Subroutine: RUBBER BANDS
  183. 1830  ' ------------------------------------------------------------------
  184. 1840  SCREEN 1
  185. 1850  LOCATE 25, 10 : PRINT "Press <ESC> to return.";
  186. 1860  WHILE (INKEY$ <> ESC$)
  187. 1870    ' -- randomly generate options for the CIRCLE statement
  188. 1880    X = (RND(1) * 319)             ' -- x coordinate
  189. 1890    Y = (RND(1) * 199)             ' -- y coordinate
  190. 1900    R = (RND(1) *  27) + 3         ' -- radius (minimum of 3 wide)
  191. 1910    TINT = (RND(1) *   3)          ' -- color
  192. 1920    ASPECT.RATIO = (RND(1) *   2)  ' -- aspect ratio
  193. 1930    ' -- draw the circle (actually the ellipse)
  194. 1940    CIRCLE (X,Y),R,TINT,,,ASPECT.RATIO
  195. 1950  WEND
  196. 1960  RETURN
  197. 1970  ' ------------------------------------------------------------------
  198. 1980  ' -- Subroutine: LINE GRAPH
  199. 1990  ' ------------------------------------------------------------------
  200. 2000  SCREEN 1    :  TINT = 2
  201. 2010  LOCATE 1, (40 - (LEN(GRAPH.TITLE$)))/2 : PRINT GRAPH.TITLE$;
  202. 2020  GOSUB 2180  :  ' -- read the data 
  203. 2030  GOSUB 2310  :  ' -- draw scale axes
  204. 2040  GOSUB 2390  :  ' -- label x axis
  205. 2050  GOSUB 2600  :  ' -- label y axis
  206. 2060  ' -- plot the points
  207. 2070  FOR CASE = 1 TO NUM.CASES
  208. 2080    X(CASE) = ((BAR.WIDTH + GAP) * CASE) + START.X + GAP
  209. 2090    Y(CASE) = INT(END.Y - ((VALUE(CASE)/SCALE.VALUE)*LENGTH.Y))
  210. 2100    CIRCLE (X(CASE), Y(CASE)),2,TINT
  211. 2110  NEXT 'CASE
  212. 2120  ' -- connect each set of points with a line
  213. 2130  FOR CASE = 2 TO NUM.CASES
  214. 2140    LINE(X(CASE-1),Y(CASE-1))-(X(CASE),Y(CASE)),TINT-1
  215. 2150  NEXT 'CASE
  216. 2160  GOSUB 1750  :  ' -- wait for user 
  217. 2170  RETURN
  218. 2180  ' ------------------------------------------------------------------
  219. 2190  ' -- Subroutine: READ DATA VALUES AND LABELS
  220. 2200  ' ------------------------------------------------------------------
  221. 2210  RESTORE 160
  222. 2220  ' -- read the data values
  223. 2230  FOR CASE = 1 TO NUM.CASES
  224. 2240    READ VALUE(CASE)
  225. 2250  NEXT 'CASE
  226. 2260  ' -- read the labels
  227. 2270  FOR CASE = 1 TO NUM.CASES
  228. 2280    READ LABEL$(CASE)
  229. 2290  NEXT 'CASE
  230. 2300  RETURN
  231. 2310  ' ------------------------------------------------------------------
  232. 2320  ' -- Subroutine: DRAW AXES
  233. 2330  ' ------------------------------------------------------------------
  234. 2340  ' -- draw the y (vertical) axis
  235. 2350  LINE (START.X, START.Y) - (START.X, END.Y)
  236. 2360  ' -- draw the x (horizontal) axis
  237. 2370  LINE (START.X, END.Y) - (END.X, END.Y)
  238. 2380  RETURN
  239. 2390  ' ------------------------------------------------------------------
  240. 2400  ' -- Subroutine: LABEL X (HORIZONTAL) AXIS WITH TEXT LABELS
  241. 2410  ' ------------------------------------------------------------------
  242. 2420  FOR CASE = 1 TO NUM.CASES
  243. 2430    ' -- calculate where this label belongs
  244. 2440    TICK = ((BAR.WIDTH + GAP) * CASE) + START.X + GAP
  245. 2450    ' -- draw a tick mark there
  246. 2460    LINE (TICK, END.Y+5) - (TICK, END.Y)
  247. 2470    ' -- convert the tick mark's location to text screen coordinates
  248. 2480    ROW = INT((END.Y+5)/TEXT.CELL.HEIGHT)
  249. 2490    COL = INT(TICK/TEXT.CELL.WIDTH) + GAP
  250. 2500    ' -- determine how long the label is (allow up to 3 characters)
  251. 2510    LABEL.LENGTH = LEN(LABEL$(CASE))
  252. 2520    IF LABEL.LENGTH > 3 THEN LABEL.LENGTH = 3
  253. 2530    ' -- print the label
  254. 2540    FOR BYTE = 1 TO LABEL.LENGTH
  255. 2550      LOCATE (ROW + BYTE + 1), COL
  256. 2560      PRINT MID$(LABEL$(CASE), BYTE, 1);
  257. 2570    NEXT 'BYTE
  258. 2580  NEXT 'CASE
  259. 2590  RETURN
  260. 2600  ' ------------------------------------------------------------------
  261. 2610  ' -- Subroutine: LABEL Y (VERTICAL) AXIS WITH NUMERIC LABELS
  262. 2620  ' ------------------------------------------------------------------
  263. 2630  ' -- find highest value of the variable
  264. 2640  HIGH.VALUE = 0
  265. 2650  FOR CASE = 1 TO NUM.CASES
  266. 2660    IF (HIGH.VALUE < VALUE(CASE)) THEN HIGH.VALUE = VALUE(CASE)
  267. 2670  NEXT 'CASE
  268. 2680  ' -- find the next round number greater than the highest value
  269. 2690  SCALE.VALUE = 100
  270. 2700  WHILE (SCALE.VALUE < HIGH.VALUE)
  271. 2710    SCALE.VALUE = SCALE.VALUE + 100
  272. 2720  WEND
  273. 2730  ' -- divide the length of the y axis into equal parts
  274. 2740  TICK = LENGTH.Y/NUM.TICKS
  275. 2750  ' -- draw tick marks up the y axis
  276. 2760  FOR CASE = 0 TO NUM.TICKS
  277. 2770    LINE (START.X-5, (TICK*CASE)+START.Y) - (START.X, (TICK*CASE)+START.Y)
  278. 2780  NEXT 'CASE
  279. 2790  ' -- label each tick mark with a value
  280. 2800  FOR CASE = 0 TO NUM.TICKS
  281. 2810    LOCATE INT(((TICK*CASE)+START.Y)/TEXT.CELL.HEIGHT)+1, INT((START.X-40)/8)
  282. 2820    PRINT USING "####"; (NUM.TICKS-CASE)*(SCALE.VALUE/NUM.TICKS);
  283. 2830  NEXT 'CASE
  284. 2840  RETURN
  285. 2850  ' ------------------------------------------------------------------
  286. 2860  ' -- Subroutine: BAR GRAPH
  287. 2870  ' ------------------------------------------------------------------
  288. 2880  SCREEN 1    :  TINT = 2
  289. 2890  LOCATE 1, (40 - (LEN(GRAPH.TITLE$)))/2 : PRINT GRAPH.TITLE$;
  290. 2900  GOSUB 2180  :  ' -- read the data 
  291. 2910  GOSUB 2310  :  ' -- draw and label scale axes
  292. 2920  GOSUB 2390  :  ' -- label x axis
  293. 2930  GOSUB 2600  :  ' -- label y axis
  294. 2940  ' -- draw the bars
  295. 2950  FOR CASE = 1 TO NUM.CASES
  296. 2960    TOP.Y = INT(END.Y - ((VALUE(CASE)/SCALE.VALUE)*LENGTH.Y))
  297. 2970    TOP.X = ((BAR.WIDTH + GAP) * CASE) + START.X - INT(BAR.WIDTH/2)
  298. 2980    BOTTOM.Y = END.Y - 1
  299. 2990    BOTTOM.X = TOP.X + BAR.WIDTH - GAP
  300. 3000    LINE (TOP.X, TOP.Y) - (BOTTOM.X, BOTTOM.Y),TINT,BF
  301. 3010  NEXT 'CASE
  302. 3020  GOSUB 1750  :  ' -- wait for user 
  303. 3030  RETURN
  304. 3040  ' ------------------------------------------------------------------
  305. 3050  ' -- Subroutine: PIE CHART
  306. 3060  ' ------------------------------------------------------------------
  307. 3070  SCREEN 1    :  TINT = 1
  308. 3080  GOSUB 2180  :  ' -- read the data
  309. 3090  LOCATE 1, (40 - (LEN(GRAPH.TITLE$)))/2 : PRINT GRAPH.TITLE$;
  310. 3100  ' -- calculate the total for all values (the whole pie)
  311. 3110  TOTAL = 0
  312. 3120  FOR CASE = 1 TO NUM.CASES
  313. 3130    TOTAL = TOTAL + VALUE(CASE)
  314. 3140  NEXT 'CASE
  315. 3150  ' -- start the pie
  316. 3160  END.POINT = 0
  317. 3170  LINE (X.CENTER, Y.CENTER) - (X.CENTER+RADIUS, Y.CENTER),TINT
  318. 3180  '
  319. 3190  FOR CASE = 1 TO NUM.CASES
  320. 3200    ' -- draw a wedge of circle for this value
  321. 3210    PORTION = (VALUE(CASE)/TOTAL)
  322. 3220    START.POINT = END.POINT
  323. 3230    END.POINT = PORTION*(-2*PI) + START.POINT
  324. 3240    CIRCLE (X.CENTER, Y.CENTER),RADIUS,TINT,START.POINT,END.POINT,ASPECT
  325. 3250    ' -- find a point somewhere inside the wedge
  326. 3260    ANGLE = ((END.POINT-START.POINT)/2) + START.POINT
  327. 3270    X.POINT = X.CENTER + RADIUS/2 * COS(ANGLE)
  328. 3280    Y.POINT = Y.CENTER + RADIUS/2 * SIN(ANGLE) * ASPECT
  329. 3290    ' -- use the point to paint the inside of the wedge 
  330. 3300    PAINT (X.POINT, Y.POINT), TINT, TINT
  331. 3310    TINT = TINT + 1 : IF TINT > 3 THEN TINT = 1
  332. 3320    ' -- label the wedge
  333. 3330    X.POINT = X.CENTER + ((RADIUS+16) * COS(ANGLE))
  334. 3340    Y.POINT = Y.CENTER + ((RADIUS+16) * SIN(ANGLE)) * ASPECT + 10
  335. 3350    ROW = INT(Y.POINT/TEXT.CELL.HEIGHT)
  336. 3360    COL = INT(X.POINT/TEXT.CELL.WIDTH)
  337. 3370    LOCATE ROW, COL, NO.CURSOR  :  PRINT LABEL$(CASE);
  338. 3380  NEXT 'CASE
  339. 3390  GOSUB 1750  :  ' -- wait for user 
  340. 3400  RETURN
  341. 3410  ' ------------------------------------------------------------------
  342. 3420  ' -- Subroutine: TURTLE
  343. 3430  ' ------------------------------------------------------------------
  344. 3440  GOSUB 3770  : ' -- give instructions
  345. 3450  ' -- set up environment
  346. 3460  SCREEN 1     : COLOR 0, 0   : TINT = 1
  347. 3470  X = X.CENTER : Y = Y.CENTER : PSET(X, Y), TINT
  348. 3480  GOSUB 1630  ' -- NumLock ON (for easy use of cursor keys)
  349. 3490  ' -- draw
  350. 3500  OKAY = YES
  351. 3510  WHILE (OKAY)
  352. 3520    ' -- wait for user to press a key
  353. 3530    K$ = INKEY$ :  IF K$ = "" THEN 3530
  354. 3540    ' -- if user wants to quit, then get ready to do so 
  355. 3550    IF K$ = ESC$ THEN OKAY = NO
  356. 3560    ' -- otherwise, change the coordinates
  357. 3570    IF (K$ = "1" OR K$ = "4" OR K$ = "7") THEN X = X - 1
  358. 3580    IF (K$ = "3" OR K$ = "6" OR K$ = "9") THEN X = X + 1
  359. 3590    IF (K$ = "7" OR K$ = "8" OR K$ = "9") THEN Y = Y - 1
  360. 3600    IF (K$ = "1" OR K$ = "2" OR K$ = "3") THEN Y = Y + 1
  361. 3610    ' -- or return to the center of the screen 
  362. 3620    IF K$ = "5" THEN X = X.CENTER : Y = Y.CENTER
  363. 3630    ' -- or save the drawing 
  364. 3640    IF K$ = "+" THEN DEF SEG = &HB800 : BSAVE "pic", 0, &H4000
  365. 3650    ' -- or replace this drawing with the last one
  366. 3660    IF K$ = "-" THEN DEF SEG = &HB800 : BLOAD "pic", 0
  367. 3670    ' -- or change color
  368. 3680    IF K$ = "0" THEN TINT = TINT + 1 : IF TINT > 3 THEN TINT = 0
  369. 3690    ' -- or erase everything
  370. 3700    IF K$ = "." THEN CLS : X = X.CENTER : Y = Y.CENTER
  371. 3710    PSET(X,Y), TINT
  372. 3720    'LINE (X - 2, Y - 2) - (X + 2, Y + 2),TINT,BF
  373. 3730    'CIRCLE (X, Y),2,TINT
  374. 3740  WEND
  375. 3750  GOSUB 1690  ' -- NumLock OFF
  376. 3760  RETURN
  377. 3770  ' ------------------------------------------------------------------
  378. 3780  ' -- Subroutine: TURTLE INSTRUCTIONS
  379. 3790  ' ------------------------------------------------------------------
  380. 3800  SCREEN 0     : CLS : COLOR YELLOW, BLACK
  381. 3810  LOCATE  3, 25 : PRINT ">>>   TURTLE INSTRUCTIONS   <<<"
  382. 3820  COLOR CYAN, BLACK
  383. 3830  LOCATE  7, 16 : PRINT "The TURTLE is a small dot that you push around"
  384. 3840  LOCATE  8, 25 : PRINT "on the screen to draw pictures."
  385. 3850  LOCATE 11, 22 : PRINT "Use CURSOR keys to move the turtle";
  386. 3860  LOCATE 12, 25 : PRINT "Press  <ESC>  to End"
  387. 3870  LOCATE 13, 25 : PRINT "Press   <+>   to Save Picture";
  388. 3880  LOCATE 14, 25 : PRINT "Press   <->   to Restore Picture";
  389. 3890  LOCATE 15, 25 : PRINT "Press  <Del>  to Clear Screen";
  390. 3900  LOCATE 16, 25 : PRINT "Press  <Ins>  to Change Color";
  391. 3910  LOCATE 17, 22 : PRINT "(Use black to erase unwanted points)"
  392. 3920  LOCATE 25, 28 : PRINT "Press <ESC> to continue.";
  393. 3930  WHILE (INKEY$ <> ESC$) : WEND
  394. 3940  RETURN
  395. 3950  ' ------------------------------------------------------------------
  396. 3960  ' -- Subroutine: TEXT COLOR
  397. 3970  ' ------------------------------------------------------------------
  398. 3980  SCREEN 1
  399. 3990  FOR PALETTE = 0 TO 1
  400. 4000    COLOR BLACK, PALETTE
  401. 4010    CLS : LOCATE 10
  402. 4020    FOR TINT = 0 TO 3
  403. 4030      POKE 78, TINT  :  ' -- change foreground text color
  404. 4040      PRINT TAB(15); "I LOVE YOU!"
  405. 4050      FOR DELAY = 1 TO 1000 : NEXT 'DELAY
  406. 4060    NEXT 'TINT
  407. 4070    FOR DELAY = 1 TO 2000   : NEXT 'DELAY
  408. 4080  NEXT 'PALETTE
  409. 4090  RETURN
  410. 4100  ' ------------------------------------------------------------------
  411. 4110  ' -- Subroutine: NEON GIRL
  412. 4120  ' ------------------------------------------------------------------
  413. 4130  SCREEN 1 : CLS : COLOR BLACK, 1
  414. 4140  ' -- draw a border around the screen
  415. 4150  LINE (40, 1) - (300, 185),1,B
  416. 4160  ' -- label the drawing
  417. 4170  FOR ROW = 1 TO 20
  418. 4180    LOCATE ROW, 3
  419. 4190    PRINT MID$("   N e o n   G i r l", ROW, 1);
  420. 4200  NEXT 'ROW
  421. 4210  ' -- draw the girl's right arm
  422. 4220  DRAW "C1BM67,180E2U2E2U2E6U1E1U1U2E4U1E1U2E1U6E2U3E1U2E1U2E2U2E3U2E3"
  423. 4230  DRAW "R1E3R2E1R3E1R4F2"
  424. 4240  ' -- right shoulder
  425. 4250  DRAW "BM107,172H2U4H1U6H1U6E1U4E1U3E1U5E1U3E1E1U1E2U3E3U2R1U1R10E1R3"
  426. 4260  DRAW "E1R4E1R3E1R4"
  427. 4270  ' -- neck
  428. 4280  DRAW "BM151,92C3D20L2G1L1G1L3G4C1D1F3D1F7D1F5D1F1D2F12D1F1D1F1D2F1D4"
  429. 4290  DRAW "BM187,93C3D19F2R2F5R1F1C1D4G6D1G7L1G5L2G8D1G2"
  430. 4300  ' -- left shoulder
  431. 4310  DRAW "BM199,121R1F1R1F1R2F1G1D6G1F1D6G1D4G1D11F1D1E2U1E1U2E3U3E3U3E4"
  432. 4320  DRAW "U3E4U2BM207,125R2E1F3E1F3E1R2E2R2F4D6G1L1D3G1D2G2D15G1D2G1D2G2"
  433. 4330  ' -- left arm
  434. 4340  DRAW "BM225,131E2F2R1F6R2F1D8G1D1G2D2G4BM240,139F4D2F2D2F1D4F1D2F1D11"
  435. 4350  DRAW "G2C3H2F3D2F5BM235,179C1E2U2E6R1E1"
  436. 4360  ' -- chin
  437. 4370  DRAW "C3BM143,64F1D2F1D6F1D4F1D2F1D1F1D2F1D2F5D1F2D1F2D1R5F1R6E1R4E3"
  438. 4380  DRAW "R1E3R2E4U2E1U3E1U2E1U3E1U2E2U4E2U2"
  439. 4390  ' -- bangs
  440. 4400  DRAW "BM143,64R1U1R1U4E1H1U1E2U2E1U3R1E2R5H3U5F5R1D1R5E5U1E1U2F4D4G2"
  441. 4410  DRAW "E1F1R6E2F4R3F2D4F1D2F2D1F1D2F1D2"
  442. 4420  ' -- hair
  443. 4430  DRAW "BM151,96C2L5G1U4L3H5R2E1R2E1L5H3U2E3L1H2L1H4U5E5U3L2G2D2H4E4U1"
  444. 4440  DRAW "L3H3L5G2E1U4R1E2R2H2U8E1U5E1U1ER2U1R7E1U6E3R1E4R1E1R5F3R1F7E5"
  445. 4450  DRAW "R3E1R8F4E2F2R3F1R6E4D4F3L1G3F4R4D2R5D1F2D4F1D4G2E2F3R2D4G1D1G1"
  446. 4460  DRAW "D1G2F2D2G2D1G1D2G2L4G4D1G3D1G1D5F2G1L2G2D2G1D1G2L2H3"
  447. 4470  ' -- right eye
  448. 4480  DRAW "BM150,56E2R2E1R7F1R1F1H1L8C3BM165,60G2L2G1L4H1L2H1E2R1E1R1E1R4"
  449. 4490  DRAW "F1R2F1H2L1H1L6G1BD1BR3C1G1D1F1R1E1U1H1L1"
  450. 4500  ' -- left eye
  451. 4510  DRAW "BM175,56C2R1E1R2E1R4E1R3F1L7C3BM176,60F2R1F1R7E1R1H3L1H1L5G1L1"
  452. 4520  DRAW "G1E2R1E1R6F1BD1BL5C1G1D1F1R1E1U1H1L1"
  453. 4530  ' -- nose
  454. 4540  DRAW "C3BM173,62F2BM173,64F2BM173,66F2BM173,68F2BM173,70F2BM176,72F3"
  455. 4550  DRAW "D2G1BL2H1L1G1BM170,76BM166,74D1G1D1F1R1E1R1"
  456. 4560  ' -- lips
  457. 4570  DRAW "BM160,88E1R2E1R3E1R5F1R3F1R2F1L6H1L6G1L6D1F4R1F1R8E1R1E4U1D1G2"
  458. 4580  DRAW "L3G1L8H1L2H2U1"
  459. 4590  ' -- tell user how to quit
  460. 4600  LOCATE 25, 11 : PRINT "Press <ESC> to return.";
  461. 4610  ' -- change colors to give a neon sign effect
  462. 4620  PALETTE = 0
  463. 4630  WHILE (INKEY$ <> ESC$)
  464. 4640    COLOR BLACK, PALETTE
  465. 4650    IF PALETTE = 1 THEN PALETTE = 0 ELSE PALETTE = 1
  466. 4660    FOR DELAY = 1 TO 150 : NEXT 'DELAY
  467. 4670  WEND
  468. 4680  RETURN
  469. 4690  ' ------------------------------------------------------------------
  470. 4700  ' -- Subroutine: GEO SHAPES
  471. 4710  ' ------------------------------------------------------------------
  472. 4720  ' -- foreground colors for hi-res mode
  473. 4730  SCREEN 2  :  GOSUB 1560  ' -- Randomize
  474. 4740  WHILE (1)
  475. 4750    ' -- tell user how to quit
  476. 4760    CLS : LOCATE 25, 30 : PRINT "Press <ESC> to return.";
  477. 4770    ' -- draw a geometric patter in hi-res graphics mode
  478. 4780    M=RND*50+3  :  N=RND*M+1
  479. 4790    FOR ANGLE=1 TO 32 STEP RND+0.01
  480. 4800      RADIUS=SIN((M/N)*ANGLE)*75
  481. 4810      SIDE=RADIUS/100*225
  482. 4820      LINE -(319+SIDE*SIN(ANGLE),100+RADIUS*COS(ANGLE))
  483. 4830      IF INKEY$ = ESC$ THEN RETURN
  484. 4840    NEXT 'ANGLE
  485. 4850    ' -- show all fifteen possible foreground colors
  486. 4860    FOR TINT = 1 TO 15
  487. 4870      OUT 985, TINT  :  ' -- change hi-res foreground color
  488. 4880      SOUND TINT*66, 0.1
  489. 4890      FOR DELAY = 1 TO 500  :  NEXT 'DELAY
  490. 4900      IF INKEY$ = ESC$ THEN RETURN
  491. 4910    NEXT 'TINT
  492. 4920  WEND
  493. 4930  RETURN
  494.